package manager.interfaces;

import java.util.HashMap;
import java.util.LinkedList;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.table.TableRowSorter;
import manager.auxiliares.AutoComplete;

/**
 *
 * @author Thiago
 */
public interface InterfaceRegister {

    /**
     * Implementar busca do autocompletar
     * @param opcao Por qual coluna a busca será realizada
     * @param palavraBuscada Palavra que sera buscada
     * @return LinkedList<String> Lista com o resultado
     */
    public LinkedList buscaAutoCompletar(String opcao, String palavraBuscada);

    /**
     *Implementar a busca para a tabela
     * @param opcao Por qual coluna a busca será realizada
     * @param palavraBuscada Palavra que sera buscada
     * @return LinkedList<LinkedList> (LinkedList<String>.....)
     */
    public LinkedList buscaTabela(String opcao, String palavraBuscada);

    /**
     * Retorna o titulo da entidade ao qual vamos trabalhar
     * @return Título da entidade. Ex: Usuários
     */
    public String getTituloEntidade();

    /**
     * Retorna o título do campo de busca default desta entidade
     * @return Título do campo default. Ex: Nome do Usuário
     */
    public String getTituloBuscaPadrao();

    /**
     * Retorna as opções de busca da entidade
     * @return Lista com as opções de busca
     */
    public LinkedList getOpcoesBusca();

    /**
     * Mudar a opção pela qual será buscada a entidade
     * @param autoComplete Autocompletar da entidade
     */
    public void changeOptionSearch(AutoComplete autoComplete,String option,JComboBox jComboBoxValue);

    /**
     * Informar o nome das colunas na busca
     * @return Lista com o nome das colunas
     */
    public LinkedList<String> getNomeColunaTabela();

    /**
     * Retorna o número de colunas da tabela de busca desta entidade
     * @return Número de colunas da tabela de busca
     */
    public int getColumnCount();

    /**
     * Insere uma entidade
     */
    public void inserirEntidade();

    /**
     * Edita uma entidade no banco
     * @param id
     */
    public void editarEntidade(int id);
    
    /**
     * Imprime o relatório da endidade
     * @param id 
     */
    public void imprimir(int id);
    
    /**
     * Evento do botão de filtro
     */
    public void filtro();
    
    /**
     * Retorna como a tabela será ordenada
     * @return função de comparação para ordenar a tabela
     */
    public TableRowSorter getTableSorter();
    
    /**
     * Retorna se esta entidade possui adição de novos registros
     * @return true em caso positivo, false caso contrário
     */
    public boolean isAdd();

    /**
     * Retorna se esta entidade possui edição de registros
     * @return true em caso positivo, false caso contrário
     */
    public boolean isEdit();

    /**
     * Retorna se esta entidade possui remoção de registros
     * @return true em caso positivo, false caso contrário
     */
    public boolean isRemove();

    /**
     * Retorna se esta entidade possui controle de adição e edição de arquivos
     * @return true em caso positivo, false caso contrário
     */
    public boolean isFiles();
    
    /**
     * Verifica se existe a possibilidade de filtro
     * @return true em caso positivo, false caso contrário
     */
    public boolean isFilter();
    
    /**
     * Verifica se existe algum filtro habilitado
     * @return true em caso positivo, false caso contrário
     */
    public boolean temFiltroHabilitado();
    
    /**
     * Retorna a lista de filtros habilitados
     * @return 
     */
    public HashMap<String,Object> getFiltros();

    /**
     * Retorna se esta entidade pode exportar os dados das consultas para arquivos pdf ou excell
     * @return true em caso positivo, false caso contrário
     */
    public boolean isExport();

    /**
     * Retorna se esta entidade possui atalho rápido de imprimir algum formulário
     * @return true em caso positivo, false caso contrário
     */
    public boolean isPrint();

    /**
     * Retorna o icone default do modulo desta entidade
     * @return Icone do módulo
     */
    public ImageIcon getModuleIcon();
}
